\section{变量}
PHP 中的变量用一个美元符号后面跟变量名来表示。变量名是区分大小写的。

变量名与 PHP 中其它的标签一样遵循相同的规则。一个有效的变量名由字母或者下划线开头，后面跟上任意数量的字母，数字，或者下划线。

\begin{lstlisting}
<?php
$var = 'Bob';						// 小写var
$Var = 'Joe';						// 大写Var
echo "$var, $Var";      // 输出 "Bob, Joe"

$4site = 'not yet';     // 非法变量名；以数字开头
$_4site = 'not yet';    // 合法变量名；以下划线开头
$站点 = '百度';  				// 合法变量名；可以用中文
\end{lstlisting}

\subsection{传值与引用}
变量默认总是传值赋值。那也就是说，当将一个表达式的值赋予一个变量时，整个原始表达式的值被赋值到目标变量。这意味着，例如，当一个变量的值赋予另外一个变量时，改变其中一个变量的值，将不会影响到另外一个变量。

PHP 也提供了另外一种方式给变量赋值：引用赋值。这意味着新的变量简单的引用（换言之，“成为其别名” 或者 “指向”）了原始变量。改动新的变量将影响到原始变量，反之亦然。

使用引用赋值，简单地将一个 \& 符号加到将要赋值的变量前（源变量）。例如，下列代码片断将输出“My name is Bob”两次：

\begin{lstlisting}
<?php
$foo = 'Bob';              // 将 'Bob' 赋给 $foo
$bar = &$foo;              // 通过 $bar 引用 $foo
$bar = "My name is $bar";  // 修改 $bar 变量
echo $bar;
echo $foo;                 // $foo 的值也被修改
?>
\end{lstlisting}

\subsection{变量初始化}
虽然在 PHP 中并不需要初始化变量，但对变量进行初始化是个好习惯。使用未初始化的变量会发出 E\_NOTICE 错误。

未初始化的变量具有其类型的默认值。布尔类型的变量默认值是 FALSE，整形和浮点型变量默认值是零，字符串型变量（例如用于 echo 中）默认值是空字符串以及数组变量的默认值是空数组。可以使用isset() 函数检测一个变量是否已被初始化。

\subsection{预定义变量}
PHP 提供了一套附加的预定数组，这些数组变量包含了来自 web 服务器（如果可用），运行环境，和用户输入的数据。这些数组非常特别，它们在任何范围内自动生效。因此通常被称为自动全局变量（autoglobals）或者超全局变量（superglobals）。
\begin{description}
	\item[超全局变量] 超全局变量是在全部作用域中始终可用的内置变量
	\item[\$GLOBALS] 引用全局作用域中可用的全部变量
	\item[\$\_SERVER] 服务器和执行环境信息
	\item[\$\_GET] HTTP GET 变量
	\item[\$\_POST] HTTP POST 变量
	\item[\$\_FILES] HTTP 文件上传变量
	\item[\$\_REQUEST] HTTP Request 变量
	\item[\$\_SESSION] Session 变量
	\item[\$\_ENV] 环境变量
	\item[\$\_COOKIE] HTTP Cookies
	\item[\$php\_errormsg] 前一个错误信息
	\item[\$HTTP\_RAW\_POST\_DATA] 原生POST数据
	\item[\$http\_response\_header] HTTP 响应头
	\item[\$argc] 传递给脚本的参数数目
	\item[\$argv] 传递给脚本的参数数组
\end{description}

\subsection{变量作用域}
变量的范围即它定义的上下文背景（也就是它的生效范围）。大部分的 PHP 变量只有一个单独的范围。但是，在用户自定义函数中，一个局部函数范围将被引入。任何用于函数内部的变量按缺省情况将被限制在局部函数范围内。例如：

\begin{lstlisting}
<?php
$a = 1; 			// 全局变量

function Test()
{
    echo $a; 	// 函数内部的局部变量
}

Test();
?>
\end{lstlisting}
上述脚本会提示变量未定义的错误信息。因为 echo 语句引用了一个局部变量 \$a，而且在这个范围内，它并没有被赋值。

使用global或者 \$GLOBALS数组，能在函数区块中使用全局变量。 如：

\begin{lstlisting}
<?php
$a = 1; // 全局变量

function Test() {
	global $a; // 使用global关键字申明全局变量
	echo $a; // 将显示全局变量的内容
}
Test();
?>
\end{lstlisting}
上述代码将输出1。从这个例子中我们可以看到，全局变量确实在函数内部可以使用。上述语句中，还可以使用\$GLOBALS数组：

\begin{lstlisting}
$a = 1; // 全局变量

function test2() {
	echo $GLOBALS['a']; // 使用全局数组
}

test2();
\end{lstlisting}
上面的代码还是输出1，只不过使用的是全局性数组的方式。

\subsection{可变变量}
有时候使用可变变量名是很方便的。就是说，一个变量的变量名可以动态的设置和使用。一个普通的变量通过声明来设置，例如：

\begin{lstlisting}
<?php
$a = 'hello';
$$a = ' world';
echo $a, $$a;
?>
\end{lstlisting}


一个可变变量获取了一个普通变量的值作为这个可变变量的变量名。在上面的例子中 hello 使用了两个美元符号（\$）以后，就可以作为一个可变变量的变量了。这时，两个变量都被定义了：\$a 的内容是“hello”并且 \$hello 的内容是“world”。因此，上述语句将输出hello world。
